package com.mantou.mantouaiagent.service.impl;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.mantou.mantouaiagent.advisor.MyLoggerAdvisor;
import com.mantou.mantouaiagent.entities.dto.ChatDto;
import com.mantou.mantouaiagent.service.AiService;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author: 馒头 Ai服务
 * @CreateTime: 2025-06-05
 * @Description:
 */
@Service
public class AiServiceImpl implements AiService {

    private final ChatClient chatClient;

    /**
     * 初始化对话模型
     *
     * @param dashscopeChatModel
     */
    public AiServiceImpl(ChatModel dashscopeChatModel) {
        chatClient = ChatClient.builder(dashscopeChatModel)
                .defaultAdvisors(new MyLoggerAdvisor())
                .build();
    }

    @Resource
    private RedisTemplate<String, String> stringRedisTemplate;

    @JsonPropertyOrder({"keywords","title"})
    record TitleKeyWords(List<String> keywords, String title) {
    }

    private static final String TITLE_SYSTEM_PROMPT= """
            "你是新会话标题生成器
            
            任务目标：
            当用户首次发起会话时，请执行以下操作：
            1. 识别关键词：从用户消息中提取核心主题词（不超过5个）
            2. 生成标题：将关键词组合为简洁的短语（中文/英文），作为该会话的标题
            
            处理规则：
            - 优先提取名词、动词等实体词（如：产品名称、服务类型、核心诉求）
            - 避免使用模糊词汇（如"帮助"、"问题"）
            - 保持标题在15字以内（中文）或10词以内（英文）
            - 若用户消息模糊，请根据潜在意图生成标题（示例3）
            
            结构化输出格式：
            {
              "keywords": ["关键词1", "关键词2"],
              "title": "生成的标题"
            }
            
            示例：
            1. 用户输入："我想订一张7月15日从北京飞往巴黎的经济舱机票"
            {
              "keywords": ["机票", "经济舱", "北京", "巴黎", "7月15日"],
              "title": "7.15 北京-巴黎 经济舱机票预订"
            }
        
            2. 用户输入："我的订单为什么还没发货？"
            {
              "keywords": ["订单", "发货", "延迟"],
              "title": "订单发货延迟咨询"
            }
            
            3. 用户输入："你好，请问有什么可以帮助我？"
            {
              "keywords": ["通用咨询"],
              "title": "新用户咨询"
            }
            
            注意事项：
            - 请严格按JSON格式输出，不添加额外解释
            - 保持标题的可检索性与直观性
            - 对于多语言混合内容，请按用户语言生成标题"
            - 如果不清楚用户意图，那么直接返回以下格式
            {
              "keywords": ["新会话"],
              "title": "新会话"
            }
            """;

    /**
     * 生成新标题
     * @param userDto
     * @return
     */
    @Override
    public String doChatGetTitle(ChatDto userDto) {
        TitleKeyWords entity = chatClient.prompt()
                .user(userDto.getMessage())
                .system(TITLE_SYSTEM_PROMPT)
                .call()
                .entity(TitleKeyWords.class);
        if (entity == null) {
            return "新会话";
        }
        return entity.title;
    }
}
